package com.tianhai.db.index;

/**
 * 测试B+树节点序列化/反序列化
 */
public class SerializeTest {
    public static void main(String[] args) {
        System.out.println("=== B+树节点序列化测试 ===\n");
        
        // 创建一个内部节点
        BPlusTreeNode node = new BPlusTreeNode(100, BPlusTreeNode.NodeType.INTERNAL, 64);
        node.setRoot(false);
        
        // 添加一些数据
        node.getValues().add(1);  // 第一个子节点指针
        node.getKeys().add(10);
        node.getValues().add(2);  // 第二个子节点指针
        node.getKeys().add(20);
        node.getValues().add(3);  // 第三个子节点指针
        
        System.out.println("原始节点:");
        System.out.println("  - 类型: " + node.getNodeType());
        System.out.println("  - 页ID: " + node.getPageId());
        System.out.println("  - 键: " + node.getKeys());
        System.out.println("  - 值: " + node.getValues());
        System.out.println();
        
        // 序列化
        byte[] data = node.serialize();
        System.out.println("序列化成功，数据大小: " + data.length + " 字节");
        
        // 打印前100字节
        System.out.print("前100字节: ");
        for (int i = 0; i < 100 && i < data.length; i++) {
            System.out.print(String.format("%02X ", data[i]));
            if ((i + 1) % 20 == 0) System.out.print("\n           ");
        }
        System.out.println("\n");
        
        // 反序列化
        BPlusTreeNode loadedNode = BPlusTreeNode.deserialize(data, 100, 64);
        
        System.out.println("反序列化节点:");
        System.out.println("  - 类型: " + loadedNode.getNodeType());
        System.out.println("  - 页ID: " + loadedNode.getPageId());
        System.out.println("  - 键: " + loadedNode.getKeys());
        System.out.println("  - 值: " + loadedNode.getValues());
        System.out.println();
        
        // 验证
        boolean success = true;
        if (!node.getNodeType().equals(loadedNode.getNodeType())) {
            System.out.println("✗ 节点类型不匹配");
            success = false;
        }
        if (node.getPageId() != loadedNode.getPageId()) {
            System.out.println("✗ 页ID不匹配");
            success = false;
        }
        if (!node.getKeys().equals(loadedNode.getKeys())) {
            System.out.println("✗ 键列表不匹配");
            success = false;
        }
        if (!node.getValues().equals(loadedNode.getValues())) {
            System.out.println("✗ 值列表不匹配");
            System.out.println("  原始: " + node.getValues());
            System.out.println("  加载: " + loadedNode.getValues());
            success = false;
        }
        
        if (success) {
            System.out.println("✓✓✓ 序列化/反序列化测试通过！");
        } else {
            System.out.println("✗✗✗ 序列化/反序列化测试失败");
        }
    }
}
